﻿// Inner Fire 游戏引擎库
// AttackInfo - 游戏攻击配置
//
// Copyright (c) 2025 by 尔西大帝. All rights reserved.
//
// 所属层级：应用层（4）
// 用于游戏中的攻击配置
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2025-07-05

#pragma once

#include <EASTL/vector.h>
#include <game/animation/animation_clip.h>
#include <game/config/config_info.h>
#include <memory>
#include <ref_info.h>
#include <static_string.h>
#include <xml_reader.h>

namespace ifire::game {

struct HitPhase {
public:
  HitPhase(const ikit::XmlNode& node);

  inline float GetStart() const { return range.x; }
  inline float GetEnd() const { return range.y; }

public:
  // 这个攻击在整个项目伤害中所占的百分比。所有的HitPhase加起来应该是100%。
  // 在配置中使用的是[0-100]的浮点数，载入进来之后，会进行X0.01的操作
  float percent;

private:
  // 这个攻击的时间范围。以百分比为单位，在以前做Unity的时候我曾经想过用时间或者帧。
  // 但最终发现使用百分比更加容易理解。
  // 在配置中使用的是[0-100]的浮点数，载入进来之后，会进行X0.01的操作
  IVec2 range;
};

class AttackInfo : public ConfigInfo {
public:
  AttackInfo(ConfigManager* manager, const ikit::XmlNode& node);
  AttackInfo(const AttackInfo& lhs) = delete;
  AttackInfo& operator=(const AttackInfo& lhs) = delete;
  ~AttackInfo() = default;

  void Setup() override;

  float GetDuration();
  float GetCancelTime() const;

public:
  // 引用的动画Clip
  ikit::rinfo<AnimationClip> animation;
  // 攻击的阶段
  eastl::vector<HitPhase> hit_phases;
  // 攻击的时间（如果不配置，则从Clip中获得，如果在这里配置，可以节约载入的时间，否则需要载入Animation才行）
  float duration;
  // 攻击的可取消时间，当攻击已经进行过这个时间的时候，则可以取消。如果配置为0，则设置为默认的70%的时间。
  // 即1秒的攻击，在0.7秒如果再次按下攻击，则会立刻发动下一次攻击，而不需要等这个动画播放完
  float cancel_time;

};

using AttackInfoPtr = std::unique_ptr<AttackInfo>;

} // namespace ifire::game